home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / ODF / Framewrk / FWPart / FWExtMgr.cpp < prev    next >
Encoding:
Text File  |  1996-09-17  |  6.9 KB  |  237 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWExtMgr.cpp
  4. //    Release Version:    $ ODF 2 $
  5. //
  6. //    Copyright:            (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "FWFrameW.hpp"
  11.  
  12. #ifndef FWEXTMGR_H
  13. #include "FWExtMgr.h"
  14. #endif
  15.  
  16. #ifndef FWPRIDEB_H
  17. #include "FWPriDeb.h"
  18. #endif
  19.  
  20. // ----- OpenDoc Includes -----
  21.  
  22. #ifndef _ISOSTR_
  23. #include "ISOStr.h"
  24. #endif
  25.  
  26. #ifndef SOM_ODExtension_xh
  27. #include "Extensn.xh"
  28. #endif
  29.  
  30. //========================================================================================
  31. //    RunTime Info
  32. //========================================================================================
  33.  
  34. #ifdef FW_BUILD_MAC
  35. #pragma segment extensionmanager
  36. #endif
  37.  
  38. FW_DEFINE_AUTO(FW_CExtensionManager)
  39.  
  40. #ifdef FW_USE_TEMPLATE_PRAGMAS
  41.  
  42. #pragma template_access public
  43. #pragma template FW_TMap<const char*, FW_SPrivExtension>
  44. #pragma template FW_TPair<const char*, FW_SPrivExtension>
  45.  
  46. #endif
  47.  
  48. //========================================================================================
  49. //    Key Matching Function
  50. //========================================================================================
  51.  
  52. static int FW_PrivCompareExtensions(void* p1, void* p2);
  53.  
  54. int FW_PrivCompareExtensions(void* p1, void* p2)
  55. {
  56.     FW_CPrivNameToExtensionPair* pair1 = (FW_CPrivNameToExtensionPair*)p1;
  57.     FW_CPrivNameToExtensionPair* pair2 = (FW_CPrivNameToExtensionPair*)p2;
  58.     
  59.     return ODISOStrCompare((ODISOStr)pair1->fKey, (ODISOStr)pair2->fKey);
  60. }
  61.  
  62. //========================================================================================
  63. //    class FW_CExtensionManager
  64. //========================================================================================
  65.  
  66. //----------------------------------------------------------------------------------------
  67. //    FW_CExtensionManager::FW_CExtensionManager
  68. //----------------------------------------------------------------------------------------
  69.  
  70. FW_CExtensionManager::FW_CExtensionManager(FW_CPart* part) : 
  71.     fPart(part),
  72.     fNameToExtensionMap(NULL)
  73. {
  74.     FW_END_CONSTRUCTOR
  75. }
  76.  
  77. //----------------------------------------------------------------------------------------
  78. //    FW_CExtensionManager::~FW_CExtensionManager
  79. //----------------------------------------------------------------------------------------
  80.  
  81. FW_CExtensionManager::~FW_CExtensionManager()
  82. {
  83.     FW_START_DESTRUCTOR
  84.     delete fNameToExtensionMap;
  85. }
  86.  
  87. //----------------------------------------------------------------------------------------
  88. //    FW_CExtensionManager::HasExtension
  89. //----------------------------------------------------------------------------------------
  90.  
  91. FW_Boolean FW_CExtensionManager::HasExtension(Environment* ev, const char* name)
  92. {
  93. FW_UNUSED(ev);
  94.     return (fNameToExtensionMap ? fNameToExtensionMap->Find(name) != 0 : FALSE);
  95. }
  96.  
  97. //----------------------------------------------------------------------------------------
  98. //    FW_CExtensionManager::RegisterExtension
  99. //----------------------------------------------------------------------------------------
  100.  
  101. void FW_CExtensionManager::RegisterExtension(Environment* ev, 
  102.                                             const char* name, 
  103.                                             CreateExtensionFunc createFunc,
  104.                                             void* refCon,
  105.                                             FW_Boolean cacheWhenReleased)
  106. {
  107. FW_UNUSED(ev);
  108.     if (!fNameToExtensionMap)
  109.         fNameToExtensionMap = new FW_CPrivNameToExtensionMap(FW_PrivCompareExtensions);
  110.         
  111.     FW_ASSERT(!fNameToExtensionMap->Find(name));
  112.     
  113.     fNameToExtensionMap->Add(name, FW_SPrivExtension(createFunc, refCon, cacheWhenReleased));
  114. }
  115.  
  116. //----------------------------------------------------------------------------------------
  117. //    FW_CExtensionManager::AcquireExtension
  118. //----------------------------------------------------------------------------------------
  119.  
  120. ODExtension* FW_CExtensionManager::AcquireExtension(Environment*ev, 
  121.                                                     const char* name,
  122.                                                     FW_Boolean createIt)
  123. {
  124.     ODExtension* acquiredExtension = NULL;
  125.     
  126.     if (fNameToExtensionMap)
  127.     {
  128.         FW_CPrivNameToExtensionPair* pair = fNameToExtensionMap->Find(name);
  129.         
  130.         if (pair)
  131.         {
  132.             if (!pair->fValue.fExtension && createIt)
  133.             {
  134.                 if (pair->fValue.fCreateFunction)
  135.                 {
  136.                     acquiredExtension = (pair->fValue.fCreateFunction)(ev, fPart, name, pair->fValue.fRefCon);
  137.                     pair->fValue.fExtension = acquiredExtension;
  138.                 }
  139.             }
  140.             else if (pair->fValue.fExtension && (createIt || pair->fValue.fExtension->GetRefCount(ev) > 0))
  141.             {
  142.                     // cached extensions are returned if creation is enabled or
  143.                     // if the reference count is greater than zero. this makes
  144.                     // the behavior independent of caching
  145.                 acquiredExtension = pair->fValue.fExtension;
  146.                 acquiredExtension->Acquire(ev);
  147.             }
  148.         }
  149.     }
  150.     
  151.     return acquiredExtension;
  152. }
  153.  
  154. //----------------------------------------------------------------------------------------
  155. //    FW_CExtensionManager::ReleaseExtension
  156. //----------------------------------------------------------------------------------------
  157.  
  158. FW_Boolean FW_CExtensionManager::ReleaseExtension(Environment *ev, ODExtension *extension)
  159. {
  160. #ifndef FW_DEBUG
  161. FW_UNUSED(ev);
  162. #endif
  163.     FW_ASSERT(extension!=NULL);
  164.     
  165.     FW_Boolean wasReleased = FALSE;
  166.     
  167.     if (extension && fNameToExtensionMap)
  168.     {
  169.         FW_ASSERT(extension->GetRefCount(ev) == 0);
  170.         
  171.         long mapEntries = fNameToExtensionMap->GetLength();
  172.         
  173.         for (long i = 0; i < mapEntries && !wasReleased; ++i)
  174.         {    
  175.             FW_CPrivNameToExtensionPair* pair = fNameToExtensionMap->GetItemAt(i);
  176.             if (pair->fValue.fExtension == extension)
  177.             {
  178.                 wasReleased = TRUE;
  179.                 if (!pair->fValue.fCacheWhenReleased)
  180.                 {
  181.                     pair->fValue.fExtension = NULL;
  182.                     delete extension;
  183.                 }
  184.             }
  185.         }
  186.     }
  187.     
  188.     return wasReleased;
  189. }
  190.  
  191. //----------------------------------------------------------------------------------------
  192. //    FW_CExtensionManager::PurgeCachedExtensions
  193. //----------------------------------------------------------------------------------------
  194.  
  195. void FW_CExtensionManager::PurgeCachedExtensions(Environment* ev)
  196. {
  197.     if (fNameToExtensionMap)
  198.     {
  199.         long mapEntries = fNameToExtensionMap->GetLength();
  200.         for (long i = 0; i < mapEntries; ++i)
  201.         {
  202.             FW_CPrivNameToExtensionPair* pair = fNameToExtensionMap->GetItemAt(i);
  203.             ODExtension* extension = pair->fValue.fExtension;
  204.             
  205.             if (pair->fValue.fCacheWhenReleased && extension && extension->GetRefCount(ev) == 0)
  206.             {
  207.                 pair->fValue.fExtension = NULL;
  208.                 delete extension;
  209.             }
  210.         }
  211.     }
  212. }
  213.  
  214. //----------------------------------------------------------------------------------------
  215. //    FW_CExtensionManager::AbandonExtensions
  216. //----------------------------------------------------------------------------------------
  217.  
  218. void FW_CExtensionManager::AbandonExtensions(Environment* ev)
  219. {    
  220.     PurgeCachedExtensions(ev);
  221.     
  222.     if (fNameToExtensionMap)
  223.     {
  224.         long mapEntries = fNameToExtensionMap->GetLength();
  225.         for (long i = 0; i < mapEntries; ++i)
  226.         {
  227.             FW_CPrivNameToExtensionPair* pair = fNameToExtensionMap->GetItemAt(i);
  228.             if (pair->fValue.fExtension)
  229.             {
  230.                 pair->fValue.fExtension->BaseRemoved(ev);
  231.                 pair->fValue.fExtension = NULL;
  232.             }
  233.             
  234.         }
  235.     }
  236. }
  237.